package com.catmiao.rdd.operate.transform;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import scala.Serializable;

import java.util.Arrays;
import java.util.List;

/**
 * @author ChengMiao
 * @title: Transfer_01_Map
 * @projectName spark_study
 * @description: TODO
 * @date 2024/11/25 16:27
 */
public class Transfer_17_Action2 {

    public static void main(String[] args) throws InterruptedException {

        final SparkConf conf = new SparkConf();
        conf.setAppName("appName");
        conf.setMaster("local[*]");

        final JavaSparkContext jsc = new JavaSparkContext(conf);


        List<Integer> list = Arrays.asList(1, 2, 3, 4);
        JavaRDD<Integer> rdd = jsc.parallelize(list, 2);



        Stu stu = new Stu();

        /**
         * 【1,2】 【3,4】
         * foreach 算子是分布式循环，分区内有序，分区间无需
         *   org.apache.spark.SparkException: Task not serializable
         *   Caused by: java.io.NotSerializableException: com.catmiao.rdd.operate.transform.Stu
         *   原因：Stu对象是在Driver端被创建的，
         *
         *
         */
        rdd.foreach(
                num ->{
                    // TODO 在Executor端使用到了在Driver端创建的对象
                    //  运行过程中，需要将Driver端的对象通过网络发送到Executor中，需要将对象序列化，否则无法传递
                    System.out.println(stu.age + num);
                }
        );

        jsc.close();


    }
}

class Stu implements Serializable{
    public int age = 30;
}
